package com.wrapper;

public class IntegerDemo {
    public static void main(String[] args) {
        /**
         * Java的包装类（Wrapper Classes）是一组特殊的类，它们提供了原始数据类型（primitive data types，如int、double、char等）的类等价物。这些包装类的主要作用是将原始类型转换为对象，从而能够使用对象的方法和特性。以下是Java中所有原始类型及其对应的包装类的列表：
         *
         * 1. **Byte**: 包装类为`Byte`，用于表示8位的有符号整数，范围从-128到127。
         * 2. **Short**: 包装类为`Short`，用于表示16位的有符号整数，范围从-32,768到32,767。
         * 3. **Integer**: 包装类为`Integer`，用于表示32位的有符号整数，范围从-2,147,483,648到2,147,483,647。
         * 4. **Long**: 包装类为`Long`，用于表示64位的有符号整数，范围从-9,223,372,036,854,775,808到9,223,372,036,854,775,807。
         * 5. **Float**: 包装类为`Float`，用于表示32位的单精度浮点数。
         * 6. **Double**: 包装类为`Double`，用于表示64位的双精度浮点数。
         * 7. **Character**: 包装类为`Character`，用于表示单个16位的Unicode字符。
         * 8. **Boolean**: 包装类为`Boolean`，用于表示逻辑值`true`或`false`。
         *
         * 包装类的一些常见用途包括：
         *
         * - **自动装箱和拆箱**：Java 5及更高版本引入了自动装箱和拆箱的特性，允许在原始类型和其对应包装类之间自动转换。例如，`Integer i = 100;`（自动装箱）和`int n = i;`（自动拆箱）。
         * - **对象方法**：包装类提供了一些有用的方法，如`Integer.toString(int i)`、`Double.isNaN(double v)`等，这些方法可以在原始类型上执行对象特有的操作。
         * - **集合框架**：由于原始类型不能直接作为集合的元素，包装类允许我们将原始类型的对象存储在集合（如`ArrayList`、`HashSet`等）中。
         * - **API要求**：某些Java API要求对象类型的参数，即使它们操作的是原始类型数据。在这种情况下，我们需要使用包装类。
         * - **数值范围和精度**：包装类提供了更多的数值操作，如处理最大值、最小值、数值舍入等。
         *
         * 包装类在Java编程中非常有用，它们扩展了原始类型的能力，使得原始类型可以像对象一样被处理。这在需要使用对象特性的场合尤其重要。
         */

        int i = 123;
        Integer i1 = new Integer(i);
        Integer i2 = new Integer(i);
        System.out.println("i1 = " + i1);
        System.out.println("i2 = " + i2);
        System.out.println(i1 == i2);//false
        System.out.println(i1.equals(i2));//true

        double d = 123.123;
        Double v1 = new Double(d);
        Double v2 = new Double(d);
        System.out.println("v1 = " + v1);
        System.out.println("v2 = " + v2);
        System.out.println(v1.equals(v2));//true

        /**
         * 数字类型的包装类提供了转换为基本类型的方法
         */
        int ii = 1000;
        Integer i3 = new Integer(ii);
        int i4 = i3.intValue();
        System.out.println("i4 = " + i4);


        /**
         * int的最大和最小的取值范围api查看
         * byte的最大和最小的取值范围api查看
         */
        int imax = Integer.MAX_VALUE;
        int imin = Integer.MIN_VALUE;
        System.out.println("imax = " + imax);
        System.out.println("imin = " + imin);

        int bmax = Byte.MAX_VALUE;
        int bmin = Byte.MIN_VALUE;
        System.out.println("bmax = " + bmax);
        System.out.println("bmin = " + bmin);

        /**
         * 包装类可以将字符串解析为基本类型在进行转换时
         * 要确保字符串正确描述了基本类型可以保存的值
         */
        String str = "123";
        int i5 = Integer.parseInt(str);
        System.out.println("i5 = " + i5);

        double v = Double.parseDouble(str);
        System.out.println("v = " + v);


        int a = 100;
        Integer in = a;//这里是自动包装
        System.out.println("in = " + in);

    }
}
